package fr.adfm.service.implemenation;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import fr.adfm.dao.interfaces.ICouleurDao;
import fr.adfm.dao.interfaces.IProduitDao;
import fr.adfm.dao.interfaces.ITailleDao;
import fr.adfm.dao.interfaces.IVentePriveeDao;
import fr.adfm.dto.ArticleVetementDto;
import fr.adfm.dto.CouleurDto;
import fr.adfm.dto.MarqueDto;
import fr.adfm.dto.ProduitDto;
import fr.adfm.dto.TailleDto;
import fr.adfm.dto.VentePriveeDto;
import fr.adfm.entity.Article;
import fr.adfm.entity.ArticleVetement;
import fr.adfm.entity.Couleur;
import fr.adfm.entity.Produit;
import fr.adfm.entity.Taille;
import fr.adfm.entity.VentePrivee;
import fr.adfm.service.interfaces.IVentePriveeService;

@Component
@Transactional
public class VentePriveeService implements IVentePriveeService  {
	
	@Autowired
	IVentePriveeDao ventePriveeDao;
	
	@Autowired
	IProduitDao produitDao;
	
	@Autowired
	ITailleDao tailleDao;
	
	@Autowired
	ICouleurDao couleurDao;

	@Override
	public List<VentePriveeDto> getAllVentePrivee() {
	
		
		try{
			List<VentePrivee> list = ventePriveeDao.findAll();
			
			if(list.size()==0) return new ArrayList<VentePriveeDto>();
			
			List<VentePriveeDto> dto = new ArrayList<VentePriveeDto>();
			
			for(VentePrivee vp: list){
				VentePriveeDto vpDto = new VentePriveeDto();
				BeanUtils.copyProperties(vp,  vpDto);
				
				MarqueDto m = new MarqueDto();
				BeanUtils.copyProperties(vp.getMarque(),  m);
				vpDto.setMarque(m);
				
				dto.add(vpDto);
			}
			return dto;
		}
		catch(Exception e){
			return new ArrayList<VentePriveeDto>();
		}
	}

	@Override
	public List<ProduitDto> getAllProduits() {

		try{
			List<Produit> list = produitDao.findAll();
			
			if(list.size()==0) return new ArrayList<ProduitDto>();
			
			List<ProduitDto> dto =  BuildListProduitDto(list);
			return dto;
		}
		catch(Exception e){
			return new ArrayList<ProduitDto>();
		}
			
	}

	private  List<ProduitDto> BuildListProduitDto(Collection<Produit> produits) {

		try{	
			List<ProduitDto> dto = new ArrayList<ProduitDto>();
			
			for(Produit p: produits){
				ProduitDto pDto = new ProduitDto();
				BeanUtils.copyProperties(p,  pDto);
				
				MarqueDto marqueDto = new MarqueDto();
				BeanUtils.copyProperties(p.getMarque(),  marqueDto);
				pDto.setMarque(marqueDto);

				dto.add(pDto);
				
			}		
			return dto;
		}
		catch(Exception e){
			return new ArrayList<ProduitDto>();
		}		
	}

	@Override
	public List<ProduitDto> getAllProduits(Long idVentePrivee) {
		VentePrivee vp = ventePriveeDao.find(idVentePrivee);
		Collection<Produit> produits = vp.getProduits();
		
		return BuildListProduitDto(produits) ;
	}

	@Override
	public ArticleVetementDto getArticle(Long idProduit,Long idCouleur, Long idTaille) {
		try{
			Produit produit = produitDao.find(idProduit);
			
			Collection<Article> articles =  produit.getArticles();
			for(Article article : articles) {
				ArticleVetement articleVetement = (ArticleVetement) article;
				if(articleVetement.getTaille().getId()  != idTaille) continue;
				if(articleVetement.getCouleur().getId() != idCouleur) continue;		
				
				ArticleVetementDto articleDto = new ArticleVetementDto();
				BeanUtils.copyProperties(articleVetement ,  articleDto);
				
				CouleurDto couleurDto = new CouleurDto();
				BeanUtils.copyProperties(articleVetement.getCouleur(),  couleurDto);
				articleDto.setCouleur(couleurDto);
				
				TailleDto tailleDto = new TailleDto();
				BeanUtils.copyProperties(articleVetement.getTaille(),  tailleDto);		
				articleDto.setTaille(tailleDto);
				
				ProduitDto produitDto2 = new ProduitDto();
				BeanUtils.copyProperties(articleVetement.getProduit(),  produitDto2);
				articleDto.setProduitDto(produitDto2);
				
				return articleDto;
			}
			 		
			return null;
		}
		catch(Exception e){
			return null;
		}
	}
	
	@Override
	public List<TailleDto> getTailleForOneCouleur(ProduitDto produit, CouleurDto couleur) {
		return getTailleForOneCouleur(produit.getId(), couleur == null ? 0 : couleur.getId());
	}
	
	@Override
	public List<CouleurDto> getCouleurForOneTaille(ProduitDto produit, TailleDto taille) {
		return 	getCouleurForOneTaille(produit.getId(), taille == null ? 0 : taille.getId());
	}

	@Override
	public List<TailleDto> getTailleForOneCouleur(Long idProduit, Long idSelectedCouleur) {
		
		List<TailleDto> taillesDto = new ArrayList<TailleDto>();
		List<Taille> tailles = new ArrayList<Taille>();
		
		try {
	
			tailles = (idSelectedCouleur == 0) ? tailleDao.findTailleByProduit(idProduit)
												: tailleDao.findTailleByProduitAndCouleur(idProduit, idSelectedCouleur);
			for(Taille taille: tailles) {
				TailleDto tailleDto = new TailleDto();
				BeanUtils.copyProperties(taille,  tailleDto);
				taillesDto.add(tailleDto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return taillesDto;
		
		
	}

	@Override
	public List<CouleurDto> getCouleurForOneTaille(Long idProduit, Long idSelectedTaille) {
		List<CouleurDto> couleursDto = new ArrayList<CouleurDto>();
		List<Couleur> couleurs = new ArrayList<Couleur>();
		
		try {
	
			couleurs = (idSelectedTaille == 0) ? couleurDao.findCouleurByProduit(idProduit)
												: couleurDao.findCouleurByProduitAndTaille(idProduit, idSelectedTaille);
			for(Couleur couleur: couleurs) {
				CouleurDto couleurDto = new CouleurDto();
				BeanUtils.copyProperties(couleur,  couleurDto);
				couleursDto.add(couleurDto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return couleursDto;
	}
}
